package com.itheima.mybatis.web;

import com.itheima.mybatis.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class RequestController {

//    /**
//     * 简单参数
//     * @param request
//     * @return
//     */
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request) {
//        String name = request.getParameter("name"); //获取第一个参数name的值
//        String ageStr = request.getParameter("age"); //获取第二个参数age的值
//        int age = Integer.parseInt(ageStr);//类型转换，将字符串转为整型
//        System.out.println(name + "===" + age);
//
//        return "OK";
//    }


    /**
     * 简单参数
     * <p>
     * 特点：请求参数名与形参名完全相同
     * 参数注解：可以不加
     * 参数类型：基础类型
     * <p>
     * 问题：
     * 1. 如果请求参数名与形参名不相同，则必须在形参前面加 @RequestParam(name = "请求参数名")
     * 2. 如果要求必传某个参数，则必须在形参前面加 @RequestParam，默认写法等同于 @RequestParam(required = true)
     *
     * @param username 第一个请求参数
     * @param age      第二个请求参数
     * @return
     */
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name") String username, @RequestParam(required = false) Integer age) {

        System.out.println(username + "===" + age);
        return "OK";
    }


    // http://localhost:8080/simpleParam?name=Tom&age=10
    // 第1个请求参数： name=Tom   参数名:name，参数值:Tom
    // 第2个请求参数： age=10     参数名:age , 参数值:10

    //springboot方式
    /*@RequestMapping("/simpleParam")
    public String simpleParam(String name , Integer age) {
        System.out.println(name+"  :  "+age);
        return "OK";
    }*/

    /**
     * 简单实体参数
     * <p>
     * 特点：请求参数名与实体属性名完全相同
     * 参数注解：无需注解
     * 参数类型：实体对象类型（POJO类型）
     *
     * @return
     */
    @PostMapping("/pojoParam")
    public String pojoParam(User user) {
        System.out.println(user.getName() + "===" + user.getAge());
        return "OK";
    }

    /**
     * 复杂实体参数
     * <p>
     * 特点：请求参数名出现层级时，需要形参里定义嵌套的实体参数，且嵌套的实体参数的属性名与二级请求参数名相同
     * 参数注解：不需要
     * 参数类型：实体对象类型（POJO类型）
     *
     * @param user
     * @return
     */
    @PostMapping("/complexParam")
    public String complexParam(User user) {
        System.out.println(user.getName() + "===" + user.getAge() + "==" +
                user.getAddress().getProvince() + "==" + user.getAddress().getCity());
        return "OK";
    }

    /**
     * 数组参数
     * <p>
     * 特点：请求参数的同一个参数出现多次，请求参数名与形参数组参组名保持相同
     * 参数注解：不需要
     * 参数类型：数组
     *
     * @param hobby 数组
     * @return
     */
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby) {
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }

    /**
     * 集合参数
     * <p>
     * 特点：请求参数的同一个参数出现多次，请求参数名与形参集合参数名保持相同
     * 参数注解：@RequestParam
     * 参数类型：集合
     *
     * @param hobby 集合
     * @return
     */
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby) {

        System.out.println(hobby);

        return "OK";
    }

    /**
     * 日期参数
     * 特点：请求参数名与日期形参参数名保持相同
     * 参数注解：@DateTimeFormat(pattern = "日期格式化字符串")
     * 参数类型：LocalDateTime类型
     *
     * @param dateStr
     * @return
     */
    @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") LocalDateTime dateStr){
        System.out.println(dateStr.getMonth());
        return "OK";
    }
/**
 * JSON参数
 * 特点：请求参数名与实体属性名保持相同
 * 参数注解：@RequestBody
 * 参数类型：实体对象类型（POJO类型）
 *
 * @param user
 * @return
 */
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user) {
    System.out.println(user);
    return "OK";
}
    /**
     * 路径参数
     *
     *  特点：请求参数值在路径中参数，注意路径中没有参数名。 形参的参数名要与@RequestMapping里路径中{参数名}保持相同
     *  形参注解：@PathVariable
     *  形参类型：根据实际情况决定
     *
     *  问题：形参的参数名如果与@RequestMapping里路径中{参数名}不相同
     *  要求：必须在@PathVariable("参数名")与@RequestMapping里路径中{参数名}保持相同
     * @param id
     * @return
     */
    @RequestMapping("/pathParam/{userId}/{name}")
    public String jsonParam(@PathVariable("userId") Integer id,  @PathVariable String name) {
        System.out.println(id + "==" + name);
        return "OK";
    }


}
